package com.hwh.springdatajpademo;

import com.hwh.springdatajpademo.pojo.Pet;
import com.hwh.springdatajpademo.pojo.Role;
import com.hwh.springdatajpademo.pojo.User;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

import javax.persistence.EntityManager;

@SpringBootApplication
public class SpringDataJpAdemoApplication {

//    public static void main(String[] args) {
//        ConfigurableApplicationContext run = SpringApplication.run(SpringDataJpAdemoApplication.class, args);
//        for (String arg : run.getBeanDefinitionNames()) {
//            System.out.println(arg);
//        }
//        Role tom = run.getBean("tom", Role.class);
//        Role tom2 = run.getBean("tom", Role.class);
//        //测试Bean获取是否是单实例
//        System.out.println(tom==tom2);
//        //配置文件也同样是一个Bean
//        BeanConfig bean = run.getBean(BeanConfig.class);
//        System.out.println(bean);
//        //从配置类里多次获取对象，是从容器里拿还是普通的调用对象呢？
//        //BeanConfig本身就是一个代理对象BeanConfig$$EnhancerBySpringCGLIB$$7f1a9433@72fc41d3
//        //springboot总会检查这个组件是否存在于容器，如果没有就新创，有就有旧的，保持住组件单实例
//        //如果不是代理对象的话，那容器里获取的组件就不会是相同的实例
//        User user = bean.user01();
//        User user1 = bean.user01();
//        //一但Config组件注册后，外部无论调用多少次，获取的都是注册容器中的单实例
//        System.out.println(user==user1);
//
//        //从容器中获取user01和宠物zed，测试宠物zed里的user是不是user01
//        User user01 = run.getBean("user01", User.class);
//        Pet zed = run.getBean("zed", Pet.class);
//        System.out.println(zed.getUser() == user01);
//    }
    //让Spring管理JPAQueryFactory
    @Bean
    public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
        return new JPAQueryFactory(entityManager);
    }
}
